我們再來會使用packstack建立OpenStack環境進行學習,packstack有提供很多的參數,可以讓我們依不同的情境建立不同架構的OpenStack。今天,我們先建立一個單一節點的OpenStack,這個OpenStack只能建立 local
這個種類的虛擬網路。正常的情況下,local
類型的網路不會有人使用,但做為用來理解Neutron如何和OVN合作建立虛擬網路,是一個很好的開始。
可以用下面的指令,建立一個最簡單的環境出來,之後隨著我們要驗證的架構不同,只要稍為修改參數,就可以建立不同形式的環境來學習,很方便的。
$ packstack --allinone \
--nova-libvirt-virt-type=kvm \
--keystone-admin-passwd=password \
--os-debug-mode=y \
--provision-demo=n \
--os-neutron-ml2-type-drivers=local \
--os-neutron-ml2-tenant-network-types=local \
--os-neutron-ml2-mechanism-drivers=ovn \
--os-neutron-l2-agent=ovn \
--os-cinder-install=n \
--os-swift-install=n \
--os-aodh-install=n \
--os-ceilometer-install=n
或是直接用準備好的Vagrantfile 透過vagrant建立也是可以。不過這個VM會需要8G的RAM,大家要注意自己電腦夠不夠跑。
git clone https://github.com/ogre0403/iTHome-2023
cd iTHome-2023/day-09
vagrant up
今天我們先從OpenStack開始,來了解一下怎麼在OpenStack建立虛擬網路,並且建立VM讓這些VM互相通信。下面就是預計要完成的OpenStack網路長像。這裡建立了二個OpenStack的Network,都是屬於local
這個類形;左邊的Network有二個VM,右邊的Network有一個VM。很直覺地左手邊的二個VM因為在同一個Network裡,所以可以互相通信;右手邊的第三個VM,和另外二個VM不在同一個網路,所以無法連通。另外,圖中也把OpenStack裡的 port 這個概念也描述出來,等等我們再一起說明吧,先來看怎麼在OpenStack上把這個架構建立出來。
我們的範例是透過openstack command 來建立,先依下列指令登入OpneStack後,後面的操作就直接ctrl-c、ctrl-v照做就可以囉。
# 登入openstakc VM vagrant ssh # 切換root,使用家目錄下的openstakc的keyfile sudo su cd source keystonerc_admin
openstack network create --provider-network-type local n1
openstack subnet create --subnet-range 172.16.100.0/24 --network n1 n1subnet
IMAGE_ID=$(openstack image show cirros --format json | jq -r .id)
openstack server create --nic net-id=n1,v4-fixed-ip=172.16.100.10 --flavor m1.nano --image $IMAGE_ID vm_1
openstack server create --nic net-id=n1,v4-fixed-ip=172.16.100.20 --flavor m1.nano --image $IMAGE_ID vm_2
#顯示目前建立的二個instance
virsh list
Id Name State
-----------------------------------
1 instance-00000001 running
2 instance-00000002 running
#透過id 打開 instance的console,用 'cirros' & 'gocubsgo' 登入
virsh console 1
____ ____ ____
/ __/ __ ____ ____ / __ \/ __/
/ /__ / // __// __// /_/ /\ \
\___//_//_/ /_/ \____/___/
http://cirros-cloud.net
login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
vm-1 login:
第二個Network完全相同的作法,大家自己試試吧
openstack network create --provider-network-type local n2
openstack subnet create --subnet-range 192.168.200.0/24 --network n2 n2subnet
IMAGE_ID=$(openstack image show cirros --format json | jq -r .id)
openstack server create --nic net-id=n2,v4-fixed-ip=192.168.200.30 --flavor m1.nano --image $IMAGE_ID vm_3
因為OpenStack資源的ID都是UUID的格式,長度太長不易閱讀,所以之後所有顯示的UUID,都只會取其前六個字元表示。
openstack network list
+--------+------+--------+
| ID | Name | Subnets|
+--------+------+--------+
| b95d97 | n2 | 504a3e |
| c51354 | n1 | 8f6107 |
+--------+------+--------+
Port在OpenStack官方文件的定義,
A port is a connection point for attaching a single device, such as the NIC of a server, to a network. The port also describes the associated network configuration, such as the MAC and IP addresses to be used on that port.
Port 是一個抽象的概念,我們可以理解成是OpenStack用於表示一個虛擬機器(VM)或OpenStack上其他類型的資源與底層網絡之間的連接點。那Port又是如何與底層網絡建立連接的關係呢?我們等下就來看看,先來看一下這裡列出的Port,透過使用的IP分為二大類,一類是屬於第一個Network(172.16.100.0/24);另一類是屬於第二個Network(192.168.200.0/24)。應該可以注意到,每一個VM所使用的IP,都會有一個相對應的Port存在;另外,每個Network都還預先使用了.2
這個IP。這個是OpenStack的metadata在用的IP,過幾天也會說明。
openstack port list
+--------+------+-------------------+--------------------------------------------------+--------+
| ID | Name | MAC Address | Fixed IP Addresses | Status |
+--------+------+-------------------+--------------------------------------------------+--------+
| 23cb33 | | fa:16:3e:03:33:b4 | ip_address='172.16.100.20', subnet_id='8f6107' | ACTIVE |
| 4b34ef | | fa:16:3e:31:ab:ca | ip_address='172.16.100.10', subnet_id='8f6107' | ACTIVE |
| 6508f1 | | fa:16:3e:ce:e2:8a | ip_address='192.168.200.2', subnet_id='504a3e' | DOWN |
| 8ddc40 | | fa:16:3e:77:1e:6e | ip_address='172.16.100.2', subnet_id='8f6107' | DOWN |
| e5bfc6 | | fa:16:3e:f6:9d:72 | ip_address='192.168.200.30', subnet_id='504a3e' | ACTIVE |
+--------+------+-------------------+--------------------------------------------------+--------+
我們在回來用ovn-nbctl看一下目前有那些logical switch。可以看到現在有二個logical switch, 共有5個port, 在第一個switch上有三個port,在第二個switch上有二個port。到目前,細心的小夥伴是不是開始覺得與剛剛看到的OpenStack的Netwrok 和 Port的數量是相對應的。不只如此,我們再細看logical switch的名字與logical switch port的名字,是不是注意到在OpenStack上所使用的UUID,剛好和OVN的logical switch與logical port的名字完全是一對一的對應呢?
ovn-nbctl show
switch a198c4 (neutron-b95d97) (aka n2)
port 6508f1
type: localport
addresses: ["fa:16:3e:ce:e2:8a 192.168.200.2"]
port e5bfc6
addresses: ["fa:16:3e:f6:9d:72 192.168.200.30"]
switch 09eaf3 (neutron-c51354) (aka n1)
port 8ddc40
type: localport
addresses: ["fa:16:3e:77:1e:6e 172.16.100.2"]
port 4b34ef
addresses: ["fa:16:3e:31:ab:ca 172.16.100.10"]
port 23cb33
addresses: ["fa:16:3e:03:33:b4 172.16.100.20"]
如果看指令的結果不清楚的話,依照前幾天介紹OVN的方式,把logical switch和之上的port把他畫出來,再與今天要完成的OpenStack網路對比一下,是不是完全相同。
所以,以OpenStack的角度來看,在同一個Network下的二個VM網路可以互通,其實就是對應到之前介紹的OVN的一個logical switch上的二個namespace可以互相通信的原理。如此一來,是不是就把OpenStack與OVN二者之間的關係結合起來呢。
今天的最後,我們來回憶一下第一天曾提到我所使用的OVN架構圖與 OVN 官方文件上稍有不同。官網上是由 CMS(Cloud Manager System) 寫入 Northbound Database,但我使用的是 ovn-nbctl。今天我們把第一天的架構圖稍加修改,把ovn-nbctl換成CMS(可以想像就是OpenStack),CMS 先將建立的 Network 模型轉換成 OVN 邏輯網路的描述,然後再將其寫入 Northbound Database。再注意到今天一開始packstack的有使用--os-neutron-l2-agent=ovn
參數,就是對應到圖中,OpenStack的Neutron會使用OVN driver和North bound DB溝通。現在,是不是更能理解OVN與OpenStack的關連了呢?